#include <iostream>

using namespace std;
//常函数:
//成员函数后加const后我们称为这个函数为常函数
//常函数内不可以修改成员属性
//成员属性声明时加关键字mutable后，在常函数中依然可以修改

//常对象:
//声明对象前加const称该对象为常对象
//常对象只能调用常函数
class Person {
public:
    int age;
    mutable int high;//加上mutable关键字，特殊变量，即使在常函数中，也可以修改这个值

    Person() {

    }

    Person(int age, int high) : age(age), high(high) {

    }

    //this指针的本质 是指针常量  指针的指向是不可以修改的
    //const Person * const this
    //在成员函数后面加上const，修饰的是this指针，让指针指向的值也不可以修改
    void show() const {
        //this = nullptr;//指针的指向是不可修改的
        //this->age = 10;
        this->high = 10;//特殊变量，即使在常函数中，也可以修改这个值,加关键字mutable
    }

    void func() {
        cout << "func函数调用！" << endl;
    }
};

void test1() {
    Person person;
    person.show();
}

void test2() {
    const Person person(5, 8);
    //person.age=10;
    person.high = 10;//特殊变量，即使在常对象中，也可以修改这个值
    person.show();//常对象只能调用常函数
    //person.func();
}

int main() {
    test1();
    test2();
    return 0;
}
